% *******************************************
% SECTION
% *******************************************
\section{任务6：实验地址随机化}

在本实验的开始，我们关闭了其中一种防护措施——地址空间布局随机化（ASLR）。在这个任务中，我们将重新启用该功能，并观察它如何影响攻击。您可以在虚拟机上运行以下命令来启用 ASLR。此更改是全局性的，并且将会影响虚拟机内部所有正在运行的容器。

\begin{lstlisting}
$ sudo /sbin/sysctl -w kernel.randomize_va_space=2
\end{lstlisting}

请向第一关和第三关服务器发送一个 \texttt{hello} 消息，多发几次。在您的报告中，请记录您的观察结果，并解释为什么启用 ASLR 使缓冲区溢出攻击会更加困难。

\ifdefined\arm
\else
% 以下活动仅适用于 32 位服务器程序。
\paragraph{击败 32 位随机化}
据报道，在 32 位 Linux 系统中，可用进行地址随机化的比特数仅为 19 比特。这不够用，如果我们反复运行攻击，则很容易击中目标。对于 64 位系统，用于随机化的比特数显著增加。

在这个任务中，我们将在 32 位的第一关的服务器上尝试此方法。我们将使用暴力方法反复攻击该服务器，希望我们的负载中的地址最终会是正确的。我们将使用在第一关攻击中使用的负载。您可以使用以下 Shell 脚反复攻击目标服务器。如果成功获得反向 shell，脚本会停止。如果您足够幸运，在 10 分钟内应该可以获取到一个反向 shell。

\begin{lstlisting}[language=bash]
#!/bin/bash

SECONDS=0
value=0
while true; do
  value=$(( $value + 1 ))
  duration=$SECONDS
  min=$(($duration / 60))
  sec=$(($duration % 60))
  echo "$min minutes and $sec seconds elapsed."
  echo "The program has been running $value times so far."
  cat badfile | nc 10.9.0.5 9090
done
\end{lstlisting}
\fi


% *******************************************
% SECTION
% *******************************************
\section{任务7：实验其他防护措施}

% -------------------------------------------
% SUBSECTION
% -------------------------------------------
\subsection{任务7.a: 启用 StackGuard 保护}

许多编译器，如 \texttt{gcc}，实现了一种称为 \textit{StackGuard} 的安全机制，以防止缓冲区溢出。在有此防护机制的情况下，缓冲区溢出攻击将不会生效。
实验里的被攻击程序是在未启用 StackGuard 保护的情况下编译的。
在这个任务中，我们将打开它并观察会发生什么。

请前往 \texttt{server-code} 文件夹，在 \texttt{gcc} 参数中去掉 \texttt{-fno-stack-protector} 选项，并重新编译 \texttt{stack.c}。我们仅使用 \texttt{stack-L1}，但与其在容器中运行该程序，我们将直接从命令行运行它。请创建一个可以导致缓冲区溢出的文件，然后向 \texttt{stack-L1} 传入该文件的内容。请描述并解释您的观察结果。

\begin{lstlisting}
$ ./stack-L1 < badfile 
\end{lstlisting}

% -------------------------------------------
% SUBSECTION
% -------------------------------------------
\subsection{任务7.b: 启用不可执行栈保护}

\input{part_nonexecutable_stack}